//
// Created by 86138 on 2025/5/15.
//
#include "SqStack.h"
#include <iostream>

using namespace std;

void InitStack(SqStack &S) {
    S.base = (SElemType *) malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!S.base) exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
}

Boolean StackEmpty(SqStack &S) {
    if (S.base == S.top) return TRUE;
    return FALSE;
}

int StackLength(SqStack &S) {
    return S.top - S.base;
}

void ClearStack(SqStack &S) {
    S.top = S.base;
}

void DestroyStack(SqStack &S) {
    free(S.base);
    S.top = S.base = NULL;
    S.stacksize = 0;
}

Status Push(SqStack &S, SElemType &e) {
    if (S.top - S.base == S.stacksize) { // 要和stacksize比，不能和STACK_INIT_SIZE比
//        printf("栈已满，不能入栈\n");
//        return ERROR;
        Resize(S);
    }
    *S.top++ = e; // 先把e赋值给*S，然后再top++
    return OK;
}

Status Pop(SqStack &S, SElemType &e) {
    if (StackEmpty(S)) {
        printf("栈为空，不能出栈\n");
        return ERROR;
    }
    e = *--S.top;
    return OK;
}

Status GetTop(SqStack S, SElemType &e) {
    if (StackEmpty(S)) {
        printf("栈为空，不能取栈顶元素\n");
        return ERROR;
    }
    e = *(S.top - 1);
    return OK;
}

void StackTraverse(SqStack S, void(*visit) (SElemType)) {
    SElemType *p = S.base;
    while (S.top > p) {
        visit(*p++);
    }
    printf("\n");
}

Status Resize(SqStack &S) {
    printf("触发Resize\n");
    SElemType *p = S.base;
    SElemType *newbase = (SElemType *) realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
    if (!newbase) {
        printf("新空间申请失败，退出，但是原空间还可以访问\n");
        exit(OVERFLOW);
    }
    S.base = newbase;
    S.top = S.base + S.stacksize;
    S.stacksize += STACKINCREMENT;
}

//int main() {
//    system("chcp 65001"); // 设置控制台代码页为 UTF-8
//    SqStack S;
//    InitStack(S);
//    for (int i = 1; i <= 15; i++) {
//        Push(S, i);
//    }
//
//    StackTraverse(S, print);
//
//}